package com.agent.vpsserver.common.utils.digital;


import com.agent.vpsserver.common.utils.common.StringUtils;

import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * @作 者: 侯建军
 * @日 期: 2019/01/05 14:26:53
 * @描 述: 佣金计算法
 */
public class CommCal {
    /**
     * 默认数值。0.00
     */
    public final static String ZERO_BALANCE = "0.00";
    /**
     * 默认数值。0.0
     */
    public final static String ZERO_BALANCE_SINGLE = "0.0";

    public final static String SINGLE_ZERO_BALANCE_SINGLE = "0";

    /**
     * 百分之 100
     */
    public final static double FULL_PERCENT = 100d;

    /**
     * 1、四舍五入
     *
     * @param finalPrice 实际售价
     * @param comm       佣金比例
     * @param takeTax    扣税比例
     * @return
     */
    public static BigDecimal CommonRounding(double finalPrice, double comm, double takeTax) {
        BigDecimal tax = new BigDecimal(String.valueOf(takeTax));
        BigDecimal maxComm = new BigDecimal(String.valueOf(comm));
        BigDecimal price = new BigDecimal(String.valueOf(finalPrice));
        BigDecimal commmission = price.multiply(maxComm.divide(new BigDecimal("100"))).multiply(tax);
        commmission = commmission.setScale(2, BigDecimal.ROUND_DOWN);
        return commmission;
    }

    /**
     * 数
     *
     * @param num
     * @return
     */
    public static BigDecimal roundNumber(BigDecimal num) {
//      num=num.setScale(2,BigDecimal.ROUND_DOWN);
        num = num.setScale(2, BigDecimal.ROUND_DOWN);
        return num;
    }

    /**
     * 向下取整两位小数
     *
     * @param num
     * @return
     */
    public static String floorNumber(BigDecimal num) {
        if (num == null) {
            return ZERO_BALANCE;
        } else {
            return num.setScale(2, RoundingMode.FLOOR).toString();
        }
    }

    /**
     * 分转元
     *
     * @param cent
     * @return
     */
    public static String centToRMB(String cent) {
        if (StringUtils.isNumeric(cent)) {
            return floorNumber(new BigDecimal(cent).divide(new BigDecimal(100)));
        } else {
            return null;
        }
    }

    /**
     * 元转分
     *
     * @param rmb
     * @return
     */
    public static Integer rmbToCent(String rmb) {
        if (StringUtils.isNotBlank(rmb)) {
            return new Integer(new NumberElement(rmb).multiply("100").toScaleString(0));
        } else {
            return null;
        }
    }

    /**
     * 获取税后分佣金额
     *
     * @param commision
     * @param taxRate
     * @return
     */
    public static String getCommsionFromPlatform(String commision, String taxRate) {
        return floorNumber(new BigDecimal(commision).multiply(new BigDecimal(1.0).subtract(new BigDecimal(taxRate))));
    }

    /**
     * 有两位小数，且第二位小数为0时，显示 1位小数。
     * 有两位小数，且第二位小数非0时，显示 2位小数。
     * 金额 0 显示为  0.0
     * 非金额 0 显示为 0
     *
     * @param number
     * @return
     */
    public static String formatZero(String number) {
        if (StringUtils.isNotBlank(number)) {
            if (number.endsWith(SINGLE_ZERO_BALANCE_SINGLE)) {
                while (number.contains(".") && (number.length() - 2 > number.indexOf("."))) {
                    number = number.substring(0, number.length() - 1);
                }
            } else {
                while (!number.contains(".")) {
                    number += "." + SINGLE_ZERO_BALANCE_SINGLE;
                }
            }
        }
        return number;
    }

    /**
     * 有两位小数，且第二位小数为0时，显示 1位小数。
     * 有两位小数，且第二位小数非0时，显示 2位小数。
     * 金额 0 显示为  0.0
     * 非金额 0 显示为 0
     *
     * @param number
     * @return
     */
    public static String formatZero(BigDecimal number) {
        return formatZero(floorNumber(number));
    }

    /**
     * 去除小数位所有的末尾0
     * 1.01 结果 1.01
     * 1.10 结果 1.1
     * 1.00 结果 1
     *
     * @param number
     * @return
     */
    public static String stripTrailingZeros(BigDecimal number) {
        if (number == null) {
            return SINGLE_ZERO_BALANCE_SINGLE;
        }
        return number.stripTrailingZeros().toPlainString();
    }

    /**
     * 去除小数位所有的末尾0
     * 1.01 结果 1.01
     * 1.10 结果 1.1
     * 1.00 结果 1
     *
     * @param number 非正常数会报错，如a.bc
     * @return
     */
    public static String stripTrailingZeros(String number) {
        if (StringUtils.isNotBlank(number)) {
            return stripTrailingZeros(new BigDecimal(number));
        }
        return SINGLE_ZERO_BALANCE_SINGLE;
    }
}
